package cn.stimd.spring.transaction;

import java.sql.Connection;

/**
 * 该接口定义了Spring事务的属性，其中传播行为的定义类似EJB的CMT，即容器管理事务。
 * 只有当新事务开启的时候，隔离级别和超时的设置才会生效，也就是说对required、required_new和nested
 * 以外的传播行为进行设置是没有意义的。
 * 此外，并非所有的事务管理器都支持这些高级特性，有的对于非默认值会抛出异常。
 * <p>
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;       //事务存在则使用，否则开启新事务
    int PROPAGATION_SUPPORTS = 1;       //事务存在则使用，否则以无事务方式运行
    int PROPAGATION_MANDATORY = 2;      //事务存在则使用，否则抛出异常
    int PROPAGATION_REQUIRES_NEW = 3;   //事务存在则挂起，并开启新事务
    int PROPAGATION_NOT_SUPPORTED = 4;  //事务存在则挂起，始终以无事务方式运行
    int PROPAGATION_NEVER = 5;          //不支持事务，尝试开启事务报错
    int PROPAGATION_NESTED = 6;         //事务存在则运行在嵌套事务中

    int ISOLATION_DEFAULT = -1;         //默认隔离级别
    int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
    int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
    int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
    int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;

    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();
    int getIsolationLevel();
    int getTimeout();
    boolean isReadOnly();
    String getName();
}
